package com.aikg.kgrag_java.service.impl;

import com.aikg.kgrag_java.service.IntentRecognitionService;
import com.aikg.kgrag_java.utils.LLMBaichuan2;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static com.aikg.kgrag_java.utils.JointBERT.Bert;
import static com.aikg.kgrag_java.utils.TimeParser.InitExpression;
import static com.aikg.kgrag_java.utils.QueryEnvironmentDatabase.SearchDataBase;


@Service
public class IntentRecognitionServiceImpl implements IntentRecognitionService {
    /**
     * 意图分类，分情况执行步骤，返回结果
     *
     * @param sentence 语句
     * @return 见IntentRecognitionService.java文件（继承的这个就是）
     */
    @Autowired
    LLMBaichuan2 llmBaichuan2;

    @Override
    public List<String> IntentRecognition(String sentence){
        List<String> result = new ArrayList<>();
        // todo: 模板意图需要在考虑一下
        //1.规则筛选文档模板（文档模板）
        String[] keywords = {"模板", "怎么写", "咋写", "如何写", "教我写"};
        for (String keyword : keywords) {
            if (sentence.contains(keyword)) {
                result.add("1");//模板
                result.add(PrintTemplateFile(llmBaichuan2.Baichuan2Templete(sentence)));
                return result;
            }
        }

        //2.IR+NER（水文、气象、知识问答）
        JSONObject jsonObject = new JSONObject(Bert(sentence));//{"type": "气象", "loc": "北京", "time": "今晚八点"}
        String type = jsonObject.getString("type");
        String loc = jsonObject.getString("loc");
        String time = jsonObject.getString("time");

        if("气象".equals(type)){
            result.add("3");//气象
            result.add(sentence);
            result.add(Hydrometeor(loc, time, 0, sentence.replace(loc,"")));
        }else if ("水文".equals(type)){
            result.add("4");//水文
            result.add(sentence);
            result.add(Hydrometeor(loc, time, 1, sentence.replace(loc,"")));
        }else {
            result.add("2");//知识问答
            result.add(sentence);
        }
        return result;
    }

    /**
     * 根据LLM的回答，找到文件，返回用户问题的答案
     *
     * @param chatAnswer LLM的回答
     * @return 用户问题的答案
     */
    public static String PrintTemplateFile(String chatAnswer) {
        File currentDirectory = new File("C:\\Users\\11765\\Desktop\\dataset\\2.拆分数据集\\IR\\模板意图要输出的模板"); // 目录
        File[] files = currentDirectory.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String fileName = file.getName();
                    // 移除文件后缀
                    String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
                    // 检查文件名（除后缀）是否包含在大模型的回答中
                    if (chatAnswer.contains(fileNameWithoutExtension)) {
                        // 输出文件内容
                        return("您好，这里是您需要的模板：" + fileName + "\n" + FileContent(file));
                    }
                }
            }
        }
        return ("抱歉，未找到您需要的模板文件。\n请检查是模板是否已传、模板文件命名是否合理");
    }

    /**
     * 找到文件之后，读文件，内容写成string
     *
     * @param file 文件名
     * @return string
     */
    private static String FileContent(File file) {
        StringBuilder templete = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {
                templete.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return templete.toString();
    }

    /**
     * 水文气象类型，查数据库，返回查询结果
     *
     * @param loc 区域描述
     * @param time 时间描述
     * @param type 0是气象，1是水文
     * @param sentence 原语句，用来确定要检索的字段(已删除地点字段，防止产生关键字干扰)
     * @return 查询结果
     */
    private String Hydrometeor(String loc, String time, int type, String sentence){//水文气象，两个问题：1.时间地点没转化为入参，2.还没调接口
        // System.out.println(Baichuan2("",1, loc, time));
        StringBuilder result = new StringBuilder();
        ArrayList<Double> area = llmBaichuan2.Baichuan2Conditions(loc);
        ArrayList<String> timeList = InitExpression(time);
        for (String standardTime:timeList) {
            result.append(standardTime).append("该时刻下，").append(SearchDataBase(standardTime, area, type, sentence)).append("\n");
        }
        return result.toString();
    }
}

